package ui;

import sun.net.www.content.image.png;
import sun.rmi.runtime.NewThreadAction;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener,ActionListener {
    // 用于记录1~15图片的位置信息
    int[][] location=new int[4][4];

    // 用于记录空白格图片的位置
    int x=0;
    int y=0;

    //记录当前步数
    int step=0;

    // 记录图片路径
    String path="image\\数字\\";
    String gameOverPath="image\\游戏结束\\";

    //功能里有四个选项
    JMenuItem complet=new JMenuItem("一键完成(w)");
    JMenuItem replay=new JMenuItem("重新开始(b)");
    JMenuItem reregister=new JMenuItem("重新登录(l)");
    JMenuItem close=new JMenuItem("关闭游戏(c)");
    //关于游戏里有两个选项
    JMenuItem author=new JMenuItem("作者");
    JMenuItem game=new JMenuItem("游戏版本");


    public GameJFrame(){
        //初始化界面
        initJFrame();


        //初始化菜单
        initJMenu();


        //初始化游戏界面
        //随机打乱loction数组
        initLocation();
        //打乱后添加图片
        initGame();


        //显示界面
        this.setVisible(true);
    }
    //初始化主界面
    private void initJFrame(){
        //设置界面大小
        this.setSize(800,600);
        //设置界面标题
        this.setTitle("数字华容道");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        /*
        设置关闭模式
        0:点击×虚拟机不停止，界面不消失
        1:点击×虚拟机不停止，界面消失
        2:点击×，当所有界面都×了，虚拟机停止,界面消失
        3:点击×虚拟机停止，界面消失
        */
        this.setDefaultCloseOperation(3);
        //取消默认居中放置，可以按照xy坐标放置
        this.setLayout(null);
        //给界面设置键盘监听
        this.addKeyListener(this);

    }
    //初始化菜单
    private void initJMenu(){
        //创建整个菜单对象
        JMenuBar jmb=new JMenuBar();
        //菜单有两个选项，1：功能 2：关于游戏
        JMenu function=new JMenu("功能");
        JMenu aboutGame=new JMenu("关于游戏");



        //将功能里的四个选项和功能菜单绑定
        function.add(complet);
        function.add(replay);
        function.add(reregister);
        function.add(close);

        //将关于游戏里的两个选项和关于游戏菜单绑定
        aboutGame.add(author);
        aboutGame.add(game);

        //将两个菜单选项添加到JMenucar
        jmb.add(function);
        jmb.add(aboutGame);

        //给菜单增加动作监听
        complet.addActionListener(this);
        replay.addActionListener(this);
        reregister.addActionListener(this);
        close.addActionListener(this);
        author.addActionListener(this);
        game.addActionListener(this);


        //将JMenucar添加到主界面
        this.setJMenuBar(jmb);
    }
    //初始化游戏界面
    private void initGame(){
        //删除已经加载的图片
        this.getContentPane().removeAll();

        //判断游戏是否结束
        if(isGameOver()){
            gameOver();
        }
        class MouseListener implements java.awt.event.MouseListener {
            //记录该图片的位置
            int Px;
            int Py;
            public MouseListener(){}
            public MouseListener(int x,int y){
                this.Px=x;
                this.Py=y;
            }
            @Override
            public void mouseClicked(MouseEvent e) {
                //游戏结束
                if(isGameOver()){
                    return;
                }
                //空白格在上方，向上移动
                if(Px!=0) {
                    if (location[Px - 1][Py] == 0) {
                        step++;
                        System.out.println("向上移动");
                        int tem = location[Px][Py];
                        location[Px][Py] = location[Px - 1][Py];
                        location[Px - 1][Py] = tem;
                        //更新图片的位置和空白格的位置
                        x++;
                        initGame();
                    }
                }
                //空白格在下方，向下移动
                if(Px!=3) {
                    if (location[Px + 1][Py] == 0) {
                        step++;
                        System.out.println("向下移动");
                        int tem = location[Px][Py];
                        location[Px][Py] = location[Px + 1][Py];
                        location[Px + 1][Py] = tem;
                        x--;
                        initGame();
                    }
                }
                //空白格在右方，向右移动
                if(Py!=3) {
                    if (location[Px][Py + 1] == 0) {
                        step++;
                        System.out.println("向右移动");
                        int tem = location[Px][Py];
                        location[Px][Py] = location[Px][Py + 1];
                        location[Px][Py + 1] = tem;
                        y--;
                        initGame();
                    }
                }
                //空白格在左方，向左移动
                if(Py!=0) {
                    if (location[Px][Py - 1] == 0) {
                        step++;
                        System.out.println("向左移动");
                        int tem = location[Px][Py];
                        location[Px][Py] = location[Px][Py - 1];
                        location[Px][Py - 1] = tem;
                        y++;
                        initGame();
                    }
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        }
        //将15张图片加载到主界面
        for(int i=0;i<location.length;i++){
            for(int j=0;j<location[i].length;j++){
                //创建图片对象
                ImageIcon ii=new ImageIcon(path+location[i][j]+".png");
                //创建JLabel对象（容器），用于管理图片
                JLabel jl=new JLabel(ii);
                //指定加载图片到主界面上的位置
                jl.setBounds(j*100,i*100,100,100);
                //给图片添加边框
                jl.setBorder(new BevelBorder(1));
                //给图片增加鼠标监听
                jl.addMouseListener(new MouseListener(i,j));
                //把管理容器加载到界面
                this.getContentPane().add(jl);
            }
        }

        //将步数计数器加载到主界面
        JLabel jl=new JLabel("步数:"+step);
        jl.setBounds(400,400,100,25);
        jl.setBorder(new BevelBorder(1));
        this.getContentPane().add(jl);

        //刷新页面
        this.getContentPane().repaint();
    }
    //初始化图片加载位置（打乱）
    private void initLocation(){
        int[] init=new int[16];

        //init数组初始化
        for(int i=0;i<init.length;i++){
            init[i]=i;
        }

        //打乱init数组
        Random r=new Random();
        for(int i=0;i<init.length;i++){
            int index=r.nextInt(init.length);
            int tem=init[index];
            init[index]=init[i];
            init[i]=tem;
        }

        //将打乱的init数组赋值给loction二维数组
        int index=0;
        for(int i=0;i<location.length;i++){
            for(int j=0;j<location[i].length;j++){
                if(init[index]==0){//获取空白图片的位置
                    x=i;
                    y=j;
                }
                location[i][j]=init[index];
                index++;
            }
        }
    }
    //加载游戏结束界面
    private void gameOver(){
        ImageIcon go=new ImageIcon(gameOverPath+"无标题.png");
        JLabel jl=new JLabel(go);
        jl.setBounds(400,0,200,100);
        jl.setBorder(new BevelBorder(1));
        this.getContentPane().add(jl);
    }
    //一键完成游戏
    private void completeGame() {
        //将location按顺序排好
        int k = 1;
        for (int i = 0; i < location.length; i++) {
            for (int j = 0; j < location[i].length; j++) {
                if (k == 16) {
                    location[i][j] = 0;
                }
                location[i][j] = k;
                k++;
            }
        }

        //初始化游戏界面
        initGame();
    }
    //判断游戏是否结束，返回ture or false
    private boolean isGameOver(){
        //判断location中的位置即可
        int k=1;
        for(int i=0;i<location.length;i++){
            for(int j=0;j<location[i].length;j++){
                if(k==16){
                    break;
                }
                if(location[i][j]!=k){
                    return false;
                }
                else{
                    k++;
                }
            }
        }
        return true;
    }

    //键盘监听
    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
        int code=e.getKeyCode();
        System.out.println(code);
        //添加上下左右操作
        //上：38  下：40  左37  右39
        if (code==38){
            //游戏结束不能操作
            if(isGameOver()){
                return;
            }
            if(x==3){
                System.out.println("不能向上移动");
                return;
            }else{
                step++;
                System.out.println("向上移动");
                int tem=location[x][y];
                location[x][y]=location[x+1][y];
                location[x+1][y]=tem;
                x++;
                initGame();
            }
        }
        else if(code==37) {
            //游戏结束不能操作
            if(isGameOver()){
                return;
            }
            if(y==3){
                System.out.println("不能向左移动");
                return;
            }else{
                step++;
                System.out.println("向左移动");
                int tem=location[x][y];
                location[x][y]=location[x][y+1];
                location[x][y+1]=tem;
                y++;
                initGame();
            }


        }
        else if(code==39) {
            //游戏结束不能操作
            if(isGameOver()){
                return;
            }
            if(y==0){
                System.out.println("不能向右移动");
                return;
            }else{
                step++;
                System.out.println("向右移动");
                int tem=location[x][y];
                location[x][y]=location[x][y-1];
                location[x][y-1]=tem;
                y--;
                initGame();
            }
        }
        else if(code==40) {
            //游戏结束不能操作
            if(isGameOver()){
                return;
            }
            if(x==0){
                System.out.println("不能向下移动");
                return;
            }else{
                step++;
                System.out.println("向下移动");
                int tem=location[x][y];
                location[x][y]=location[x-1][y];
                location[x-1][y]=tem;
                x--;
                initGame();
            }
        }

        //一键完成功能
        else if(code==87){
           completeGame();
        }

        //重新开始游戏
        else if(code==66){
            step=0;
            initLocation();
            initGame();
        }

        //重新登录
        else if(code==76){
            //关闭游戏界面
            this.setVisible(false);
            //新建登录界面
            new LogitJFrame();
        }

        //关闭游戏
        else if(code==67){
            //关闭虚拟机
            System.exit(0);
        }

    }

    //动作监听
    @Override
    public void actionPerformed(ActionEvent e) {
        //获取菜单条目对象
        Object obj=e.getSource();
        //一键完成
        if(obj==complet){
            completeGame();
        }
        //重新开始
        else if(obj==replay){
            step=0;
            initLocation();
            initGame();
        }
        //重新登录
        else if(obj==reregister){
            //关闭游戏界面
            this.setVisible(false);
            //新建登录界面
            new LogitJFrame();
        }
        //关闭游戏
        else if(obj==close){
            //关闭虚拟机
            System.exit(0);
        }
        //关于作者
        else if(obj==author){
            System.out.println("作者：钟晓辉");

            //新建弹窗对象
            JDialog jd=new JDialog();

            //弹窗内容
            JLabel jl=new JLabel("作者：钟晓辉");
            jl.setBounds(0,0,100,50);

            //将弹窗内容加入到弹窗对象中
            jd.getContentPane().add(jl);

            //设置弹窗属性
            jd.setSize(200,200);
            jd.setAlwaysOnTop(true);
            jd.setLocationRelativeTo(null);
            //弹窗不×掉，无法进行操作
            jd.setModal(true);
            jd.setVisible(true);
        }
        //游戏版本
        else if(obj==game){
            System.out.println("版本：v1.0");

            //新建弹窗对象
            JDialog jd=new JDialog();

            //弹窗内容
            JLabel jl=new JLabel("版本：v1.0");
            jl.setBounds(0,0,100,50);

            //将弹窗内容加入到弹窗对象中
            jd.getContentPane().add(jl);

            //设置弹窗属性
            jd.setSize(200,200);
            jd.setAlwaysOnTop(true);
            jd.setLocationRelativeTo(null);
            //弹窗不×掉，无法进行操作
            jd.setModal(true);
            jd.setVisible(true);
        }
    }
}
